﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Windows;

namespace produccion.vistamodelo
{
   public class VMgridBuscar:ViewModelBase
    {

        #region fields

       private List<VMlistaGenerica> lista;
       
        #endregion
        
        #region constructors
        public VMgridBuscar(List<VMlistaGenerica> _lista) {
            lista = _lista;
            lisFiltro = _lista;
            
            //Agregar Delegado buscar a nuevas columnas
            columna1.buscar += Buscar;
            columna2.buscar += Buscar;
            columna3.buscar += Buscar;
            columna4.buscar += Buscar;
            columna5.buscar += Buscar;
            columna6.buscar += Buscar;
            columna7.buscar += Buscar;
            columna8.buscar += Buscar;
        }

        public VMgridBuscar()
        {
           

        }
        #endregion

        #region public interfaces

        RelayCommand _cmdDoubleClick;
        public ICommand cmdDoubleClick
        {
            get
            {

                if (_cmdDoubleClick == null)
                {
                    _cmdDoubleClick = new RelayCommand(x => DoubleClick());
                }
                return _cmdDoubleClick;
            }
        }

        private List<VMlistaGenerica> _lisFiltro;
        public List<VMlistaGenerica> lisFiltro {
            get { return _lisFiltro; }
            set { _lisFiltro = value;
            base.OnPropertyChanged("lisFiltro");
            }
        }
        
        private string _strTitulo;
        public string strTitulo {
            get
            {
                return _strTitulo;
            }
            set { _strTitulo = value;
            base.OnPropertyChanged("strTitulo");
            }
        
        }

        private VMlistaGenerica _selLista = new VMlistaGenerica();
        public VMlistaGenerica selLista {
            get { return _selLista; }
            set { _selLista = value;
            base.OnPropertyChanged("selLista");
            }
        }

        private VMcolumnaGenerica _columna1 = new VMcolumnaGenerica(1);
        public VMcolumnaGenerica columna1{
            get{return _columna1;}
            set { _columna1 = value;
            base.OnPropertyChanged("columna1");
            }
        }

        private VMcolumnaGenerica _columna2 = new VMcolumnaGenerica(2);
        public VMcolumnaGenerica columna2
        {
            get { return _columna2; }
            set
            {
                _columna2 = value;
                base.OnPropertyChanged("columna2");
            }
        }

        private VMcolumnaGenerica _columna3 = new VMcolumnaGenerica(3);
        public VMcolumnaGenerica columna3
        {
            get { return _columna3; }
            set
            {
                _columna3 = value;
                base.OnPropertyChanged("columna3");
            }
        }

        private VMcolumnaGenerica _columna4 = new VMcolumnaGenerica(4);
        public VMcolumnaGenerica columna4
        {
            get { return _columna4; }
            set
            {
                _columna4 = value;
                base.OnPropertyChanged("columna4");
            }
        }

        private VMcolumnaGenerica _columna5 = new VMcolumnaGenerica(5);
        public VMcolumnaGenerica columna5
        {
            get { return _columna5; }
            set
            {
                _columna5 = value;
                base.OnPropertyChanged("columna5");
            }
        }

        private VMcolumnaGenerica _columna6 = new VMcolumnaGenerica(6);
        public VMcolumnaGenerica columna6
        {
            get { return _columna6; }
            set
            {
                _columna6 = value;
                base.OnPropertyChanged("columna6");
            }
        }

        private VMcolumnaGenerica _columna7 = new VMcolumnaGenerica(7);
        public VMcolumnaGenerica columna7
        {
            get { return _columna7; }
            set
            {
                _columna7 = value;
                base.OnPropertyChanged("columna7");
            }
        }


        private VMcolumnaGenerica _columna8 = new VMcolumnaGenerica(8);
        public VMcolumnaGenerica columna8
        {
            get { return _columna8; }
            set
            {
                _columna8 = value;
                base.OnPropertyChanged("columna8");
            }
        }

        private bool _Click = false;
        public bool Click {
            get { return _Click; }
            set { _Click = value;
            }
        }

        #endregion

        #region methods
        //Filtrar lista original
        public void Buscar(VMcolumnaGenerica columna) {
            try {

                lisFiltro = lista.FindAll(x =>
                   nvl(x.strColumna1).ToUpper().Contains(columna1.strBuscar.ToUpper())&
                   nvl(x.strColumna2).ToUpper().Contains(columna2.strBuscar.ToUpper())&
                   nvl(x.strColumna3).ToUpper().Contains(columna3.strBuscar.ToUpper())&
                   nvl(x.strColumna4).ToUpper().Contains(columna4.strBuscar.ToUpper())&
                   nvl(x.strColumna5).ToUpper().Contains(columna5.strBuscar.ToUpper())&
                   nvl(x.strColumna6).ToUpper().Contains(columna6.strBuscar.ToUpper())&
                   nvl(x.strColumna7).ToUpper().Contains(columna7.strBuscar.ToUpper())&
                   nvl(x.strColumna8).ToUpper().Contains(columna8.strBuscar.ToUpper())                
                   ).ToList();


              if(String.IsNullOrEmpty(columna.strBuscar)){
                    columna.logFiltro=false;
              }else{
                columna.logFiltro=true;
              }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); 
            
            }
        
        }

        public string nvl(string valor) {
            if (String.IsNullOrEmpty(valor))
            {
                return "";
            }
            else {
                return valor;
            }
        }

        private void DoubleClick()
        {   
            base.OnPropertyChanged("Click");
        }

        public void quitarFiltros() {
            try {
                lisFiltro = lista;
                columna1.strBuscar = "";
                columna1.logFiltro =false;
                columna2.strBuscar = "";
                columna2.logFiltro = false;
                columna3.strBuscar = "";
                columna3.logFiltro = false;
                columna4.strBuscar = "";
                columna4.logFiltro = false;
                columna5.strBuscar = "";
                columna5.logFiltro = false;
                columna6.strBuscar = "";
                columna6.logFiltro = false;
                columna7.strBuscar = "";
                columna7.logFiltro = false;
                columna8.strBuscar = "";
                columna8.logFiltro = false;            
            }
            catch (Exception ex) { throw ex; }
        }
        #endregion

    }

    public class VMcolumnaGenerica : ViewModelBase
    {
        #region constructors
        public VMcolumnaGenerica(int _numColumna) {
            numNumero = _numColumna;
        }
        #endregion

        #region public interfaces
        //Parametro de a buscar
        private string _strBuscar="";
        public string strBuscar
        {
            get { return _strBuscar; }
            set
            {
                _strBuscar = value;          
                base.OnPropertyChanged("strBuscar");
            }
        }

        //Nombre de la columna
        private string _strNombre;
        public string strNombre
        {
            get { return _strNombre; }
            set
            {
                _strNombre = value;
                logOculto = false;
                base.OnPropertyChanged("strNombre");
            }
        }

        //Visibilidad de la columna
        private bool _logOculto = true;
        public bool logOculto
        {
            get { return _logOculto; }
            set
            {
                _logOculto = value;
                base.OnPropertyChanged("logOculto");
            }
        }

        //Aplica filtro
        private bool _logFiltro = false;
        public bool logFiltro
        {
            get { return _logFiltro; }
            set
            {
                _logFiltro = value;
                base.OnPropertyChanged("logFiltro");
            }
        }

        RelayCommand _cmdBuscar;
        public ICommand cmdBuscar
        {
            get
            {

                if (_cmdBuscar == null)
                {
                    _cmdBuscar = new RelayCommand(x=>buscar(this));
                }
                return _cmdBuscar;
            }
        }

        //Numero de la columna
        private int _numNumero;
        public int numNumero
        {
            get { return _numNumero; }
            set
            {
                _numNumero = value;
                base.OnPropertyChanged("numNumero");
            }
        }

        #endregion

        #region fields
        public delegate void Buscar(VMcolumnaGenerica columna);
        public Buscar buscar;
        #endregion

    }

    public class VMlistaGenerica : ViewModelBase
    {

        #region constructor

        public  VMlistaGenerica()
        {
        }
        
        #endregion
        
        #region public interfaces
        
        private string _strColumna1;
        public string strColumna1 {
            get { return _strColumna1; }
            set
            {   _strColumna1 = value;
                base.OnPropertyChanged("strColumna1");
            }
        }

        private string _strColumna2;
        public string strColumna2
        {
            get { return _strColumna2; }
            set
            {
                _strColumna2 = value;
                base.OnPropertyChanged("strColumna2");
            }
        }

        private string _strColumna3;
        public string strColumna3
        {
            get { return _strColumna3; }
            set
            {
                _strColumna3 = value;
                base.OnPropertyChanged("strColumna3");
            }
        }

        private string _strColumna4;
        public string strColumna4
        {
            get { return _strColumna4; }
            set
            {
                _strColumna4 = value;
                base.OnPropertyChanged("strColumna4");
            }
        }

        private string _strColumna5;
        public string strColumna5
        {
            get { return _strColumna5; }
            set
            {
                _strColumna5 = value;
                base.OnPropertyChanged("strColumna5");
            }
        }
        
        private string _strColumna6;
        public string strColumna6
        {
            get { return _strColumna6; }
            set
            {
                _strColumna6 = value;
                base.OnPropertyChanged("strColumna6");
            }
        }

        private string _strColumna7;
        public string strColumna7
        {
            get { return _strColumna7; }
            set
            {
                _strColumna7 = value;
                base.OnPropertyChanged("strColumna7");
            }
        }

        private string _strColumna8;
        public string strColumna8
        {
            get { return _strColumna8; }
            set
            {
                _strColumna8 = value;
                base.OnPropertyChanged("strColumna8");
            }
        }

        #endregion

    }


}

